package com.zhirun.SpringJdbcSupport;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.util.StringUtils;
import com.zhirun.SpringJdbcSupport.anotations.Column;
import com.zhirun.SpringJdbcSupport.anotations.Table;


public class SpringJDBCSupport{
	private JdbcTemplate jdbcTemplate;
	private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
	
	
	public JdbcTemplate getJdbcTemplate() {
		return this.jdbcTemplate;
	}
	
	public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}

	public void setNamedParameterJdbcTemplate(NamedParameterJdbcTemplate namedParameterJdbcTemplate) {
		this.namedParameterJdbcTemplate = namedParameterJdbcTemplate;
	}

	public NamedParameterJdbcTemplate getNamedParameterJdbcTemplate() {
		return this.namedParameterJdbcTemplate;
	}
	/**
	 * 
	 *
	 * @描述：TODO(插入一条数据)
	 *
	 * @param sql
	 * @param params
	 * @return
	 * int
	 * @创建人  ：lrz
	 * @创建时间：2017年5月25日下午5:38:12
	 * @修改人  ：lrz
	 * @修改时间：2017年5月25日下午5:38:12
	 * @修改备注：
	 * @version 1.0
	 *
	 */
	public int insert(String sql, Object[] params){
		return jdbcTemplate.update(sql, params);
	}
	/**
	 * 
	 *
	 * @描述：TODO(保存对象)
	 *
	 * @param Obj
	 * @param TbName
	 * @return
	 * @throws NoSuchMethodException
	 * @throws SecurityException
	 * @throws IllegalAccessException
	 * @throws IllegalArgumentException
	 * @throws InvocationTargetException
	 * int
	 * @创建人  ：lrz
	 * @创建时间：2017年5月26日上午9:08:46
	 * @修改人  ：lrz
	 * @修改时间：2017年5月26日上午9:08:46
	 * @修改备注：
	 * @version 1.0
	 *
	 */
	public int saveObject(Object Obj) throws NoSuchMethodException, SecurityException,
			IllegalAccessException, IllegalArgumentException, InvocationTargetException {
		Class<?> cls = Obj.getClass();
		Table table = cls.getAnnotation(Table.class);
		String tbname = "";
		String TbName = "";
		if (table != null) {
			tbname = table.name();
		}
		if (StringUtils.isEmpty(tbname)) {
			TbName = cls.getSimpleName();
		}else {
			TbName = tbname;
		}
		String Sql = " insert into " + TbName;
		String tbFields = "";
		String values = "";
		Field[] field = cls.getDeclaredFields();// 获取对象的属性
		ArrayList<Object> params = new ArrayList<Object>();
		for (int i = 0; i < field.length; i++) {
			Column col = field[i].getAnnotation(Column.class);
			String[] columns = null;
			String defualtValue = "";
			if (col != null) {
				columns = col.name();
				defualtValue = col.value();
			}
			String name = field[i].getName(); // 获取属性的名字
			name = name.substring(0, 1).toUpperCase() + name.substring(1);// 将属性的第一个字母大写
			Method m = Obj.getClass().getMethod("get" + name);
			Object value = m.invoke(Obj); // 调用getter方法获取属性值
			if (value == null) {
				value = defualtValue;
			}
			if (value != null && !StringUtils.isEmpty(value.toString())) {
				if (columns != null && columns.length > 0) {
					for (String c : columns) {
						params.add(value);
						tbFields += c + ",";
						values += "?,";
					}
				}else {
					params.add(value);
					tbFields += name + ",";
					values += "?,";
				}
			}

		}
		tbFields = "( " + tbFields.substring(0,tbFields.length()-1) + ")";
		values = "values(" + values.substring(0,values.length()-1) + ")";
		Sql += tbFields + values;
		return this.insert(Sql, params.toArray());
	}
	/**
	 * 
	 *
	 * @描述：TODO(获取一个常规对象)
	 *
	 * @param Sql
	 * @param params
	 * @param cls
	 * @return
	 * Object
	 * @创建人  ：lrz
	 * @创建时间：2017年5月27日上午10:19:54
	 * @修改人  ：lrz
	 * @修改时间：2017年5月27日上午10:19:54
	 * @修改备注：
	 * @version 1.0
	 *
	 */
	@SuppressWarnings({ "unchecked", "rawtypes" })
	public Object getUniqueResult(String Sql, Object[] params,Class cls){
		return jdbcTemplate.queryForObject(Sql, cls, params);
	}
	/**
	 * 
	 * @描述: TODO(获得自创建对象列表)
	 * @param sql
	 * @param params
	 * @param cls
	 * @return
	 * @创建人 ：lrz
	 * @创建时间： 2017年6月8日 上午10:14:57 
	 * @修改人 ：lrz
	 * @修改时间 2017年6月8日 上午10:14:57 
	 * @修改备注：
	 * @version 1.0   
	 *
	 */
	public <T> List<T> getObjects(String sql, Object[] params,RowMapper<T> cls){
		return jdbcTemplate.query(sql, params,cls);
	}
	/**
	 * 
	 * <p>@Description: TODO(获取常规对象列表)</P>  
	 * <p>@param sql
	 * <p>@param params
	 * <p>@param cls
	 * <p>@return</p>    
	 * @author lrz
	 * @创建时间 2018年1月3日
	 * @修改时间 2018年1月3日
	 * @return List<Object>      
	 * @throws  
	 *
	 */
	@SuppressWarnings({ "unchecked", "rawtypes" })
	public List<Object> getObjects(String sql, Object[] params,Class cls){
		return jdbcTemplate.queryForList(sql, cls, params);
	}
//	/**
//	 * 
//	 * @Description: TODO(分页查询)  
//	 * @param Sql
//	 * @param params
//	 * @param pageSize
//	 * @param pageNum
//	 * @return    
//	 * @author lrz
//	 * @创建时间 2017年7月20日
//	 * @修改时间 2017年7月20日
//	 * @return SimplePage<Map<String,Object>>      
//	 * @throws  
//	 *
//	 */
//	public SimplePage<List<Map<String,Object>>> getPages(String Sql ,Object[] params,int pageSize, int pageNum){
//		SimplePage<List<Map<String,Object>>> result = new SimplePage<List<Map<String,Object>>>();
//		int firstRow = (pageNum-1) * pageSize;
//		int lastRow = pageNum * pageSize;
//		StringBuffer countSql = new StringBuffer();
//		countSql.append(" select count(1) from (");
//		countSql.append(Sql);
//		countSql.append(")");
//		int count =  Integer.parseInt(this.getUniqueResult(countSql.toString(), params, Integer.class).toString());
//		result.setTotal(count);
//		if (count > 0) {
//			StringBuffer rowsSql = new StringBuffer();
//			rowsSql.append("select * ");
//			rowsSql.append(" from (select temp.*, ROWNUM num "); 
//			rowsSql.append(" from (");
//			rowsSql.append(Sql);
//			rowsSql.append(") temp "); 
//			rowsSql.append(" where rownum <= "+ lastRow +") t "); 
//			rowsSql.append(" where num > " + firstRow ); 
//			List<Map<String,Object>> rows = jdbcTemplate.queryForList(rowsSql.toString(),params);
//			result.setRows(rows);
//		}else {
//			result.setRows(new ArrayList<Map<String,Object>>());
//		}
//		return result;
//		
//	}
	/**
	 * 
	 * @Description: TODO(删除)  
	 * @param Sql
	 * @param params
	 * @return    
	 * @author lrz
	 * @创建时间 2017年7月21日
	 * @修改时间 2017年7月21日
	 * @return int      
	 * @throws  
	 *
	 */
	public int delete(String Sql, Object[] params) {
		return jdbcTemplate.update(Sql, params);
	}
	/**
	 * 
	 * <p>@Description:TODO(获取map列表)</P>  
	 * <p>@param Sql
	 * <p>@param params
	 * <p>@return</p>    
	 * @author lrz
	 * @创建时间 2017年8月10日
	 * @修改时间 2017年8月10日
	 * @return List<Map<String,Object>>      
	 * @throws  
	 *
	 */
	public List<Map<String,Object>> getMaps(String Sql, Object[] params){
		return jdbcTemplate.queryForList(Sql,params);
	}
	/**
	 * 
	 * <p>@Description: TODO(更新)</P>  
	 * <p>@param sql
	 * <p>@param params
	 * <p>@return</p>    
	 * @author lrz
	 * @创建时间 2017年10月24日
	 * @修改时间 2017年10月24日
	 * @return int      
	 * @throws  
	 *
	 */
	public int update(String sql, Object[] params) {
		return jdbcTemplate.update(sql,params);
	}
	/**
	 * 
	 * <p>@Description: TODO(按对象更新)</P>  
	 * <p>@param Obj 对象
	 * <p>@param table 表名
	 * <p>@param keyWordFiled 主键字段
	 * <p>@param keyWord 主键值
	 * <p>@return
	 * <p>@throws NoSuchMethodException
	 * <p>@throws SecurityException
	 * <p>@throws IllegalAccessException
	 * <p>@throws IllegalArgumentException
	 * <p>@throws InvocationTargetException</p>    
	 * @author lrz
	 * @创建时间 2017年10月25日
	 * @修改时间 2017年10月25日
	 * @return int      
	 * @throws  
	 *
	 */
	public int update(Object Obj,String table, String keyWordFiled,String keyWord) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
		String Sql = " update "+ table + " set ";
		StringBuffer tbFields = new StringBuffer();;
		Field[] field = Obj.getClass().getDeclaredFields();//获取对象的属性
		ArrayList<Object> params = new ArrayList<Object>();
		for (int i=0;  i < field.length; i++){
			  String name = field[i].getName(); // 获取属性的名字
			  name = name.substring(0, 1).toUpperCase() + name.substring(1);//将属性的第一个字母大写
			  tbFields.append(name);
			  tbFields.append("=?");
			  if (i < field.length-1){
				  tbFields.append(",");
			  }
			  Method m = Obj.getClass().getMethod("get" + name);
              Object value = m.invoke(Obj); // 调用getter方法获取属性值
              params.add(value);
		}
		Sql += tbFields.append(" where " + keyWordFiled + " = ?").toString();
		params.add(keyWord);
		return this.update(Sql, params.toArray());
	}
}
